package com.fsh.subject.domain.utils;

import com.alibaba.fastjson.JSON;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import org.apache.commons.lang3.StringUtils;
import org.springframework.cglib.core.internal.Function;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

@Component
public class CacheUtil<V>{

    /**
     * 这段代码使用了Google Guava库中的CacheBuilder来创建一个本地缓存。
     * 缓存的键和值的类型都为字符串。缓存的最大容量为5000，超过容量时将会自动删除旧的缓存项。
     * 缓存的过期时间为10秒，即缓存项在写入后的30秒之后会过期。
     */
    private Cache<String, String> localCache =
            CacheBuilder.newBuilder()
                    .maximumSize(5000)
                    .expireAfterWrite(30, TimeUnit.SECONDS)
                    .build();


    /**
     * function 参数就是一个函数类型的参数，它的类型是 Function<String, List<V>>。
     * 这个函数类型接受一个 String 类型的参数（即 cacheKey），并返回一个 List<V> 类型的结果
     */
    public List<V> getResult(String cacheKey, Class<V> clazz, Function<String,List<V>> function){
        List<V> resultList=new ArrayList<>();
        String content = localCache.getIfPresent(cacheKey);
        //如果缓存为空
        if(StringUtils.isBlank(content)){
            //重新获取数据 （apply实际调用的就是外部的 getSubjectCategoryBOS()）
            resultList = function.apply(cacheKey);
            //放入缓存中
            localCache.put(cacheKey, JSON.toJSONString(resultList));
        }else{
            resultList=JSON.parseArray(content,clazz);
        }
        return resultList;
    }
}
